<!doctype html>
<html>

<head>
  <meta name="generator" content="JSDoc 3.6.11">
  <meta charset="utf-8">
  <title>whatsapp-web.js 1.26.1-alpha.3 &raquo; Source: structures/MessageMedia.js</title>
  <link rel="stylesheet" href="https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i" type="text/css">
  <link rel="stylesheet" href="https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i" type="text/css">
  <link rel="stylesheet" href="https://brick.a.ssl.fastly.net/Inconsolata:500" type="text/css">
  <link href="css/baseline.css" rel="stylesheet">
</head>

<body onload="prettyPrint()">
  <nav id="jsdoc-navbar" role="navigation" class="jsdoc-navbar">
    <div id="jsdoc-navbar-container">
      <div id="jsdoc-navbar-content">
        <a href="index.html" class="jsdoc-navbar-package-name">whatsapp-web.<wbr>js 1.<wbr>26.<wbr>1-alpha.<wbr>3</a>
      </div>
    </div>
  </nav>
  <div id="jsdoc-body-container">
    <div id="jsdoc-content">
      <div id="jsdoc-content-container">
        <div id="jsdoc-banner" role="banner">
        </div>
        <div id="jsdoc-main" role="main">
          <header class="page-header">
            <h1>Source: structures/MessageMedia.js</h1>
          </header>
          <article>
            <pre class="prettyprint linenums"><code>&#x27;use strict&#x27;;

const fs &#x3D; require(&#x27;fs&#x27;);
const path &#x3D; require(&#x27;path&#x27;);
const mime &#x3D; require(&#x27;mime&#x27;);
const fetch &#x3D; require(&#x27;node-fetch&#x27;);
const { URL } &#x3D; require(&#x27;url&#x27;);

/**
 * Media attached to a message
 * @param {string} mimetype MIME type of the attachment
 * @param {string} data Base64-encoded data of the file
 * @param {?string} filename Document file name. Value can be null
 * @param {?number} filesize Document file size in bytes. Value can be null
 */
class MessageMedia {
    constructor(mimetype, data, filename, filesize) {
        /**
         * MIME type of the attachment
         * @type {string}
         */
        this.mimetype &#x3D; mimetype;

        /**
         * Base64 encoded data that represents the file
         * @type {string}
         */
        this.data &#x3D; data;

        /**
         * Document file name. Value can be null
         * @type {?string}
         */
        this.filename &#x3D; filename;
        
        /**
         * Document file size in bytes. Value can be null
         * @type {?number}
         */
        this.filesize &#x3D; filesize;
    }

    /**
     * Creates a MessageMedia instance from a local file path
     * @param {string} filePath 
     * @returns {MessageMedia}
     */
    static fromFilePath(filePath) {
        const b64data &#x3D; fs.readFileSync(filePath, {encoding: &#x27;base64&#x27;});
        const mimetype &#x3D; mime.getType(filePath); 
        const filename &#x3D; path.basename(filePath);

        return new MessageMedia(mimetype, b64data, filename);
    }

    /**
     * Creates a MessageMedia instance from a URL
     * @param {string} url
     * @param {Object} [options]
     * @param {boolean} [options.unsafeMime&#x3D;false]
     * @param {string} [options.filename]
     * @param {object} [options.client]
     * @param {object} [options.reqOptions]
     * @param {number} [options.reqOptions.size&#x3D;0]
     * @returns {Promise&amp;lt;MessageMedia&gt;}
     */
    static async fromUrl(url, options &#x3D; {}) {
        const pUrl &#x3D; new URL(url);
        let mimetype &#x3D; mime.getType(pUrl.pathname);

        if (!mimetype &amp;amp;&amp;amp; !options.unsafeMime)
            throw new Error(&#x27;Unable to determine MIME type using URL. Set unsafeMime to true to download it anyway.&#x27;);

        async function fetchData (url, options) {
            const reqOptions &#x3D; Object.assign({ headers: { accept: &#x27;image/* video/* text/* audio/*&#x27; } }, options);
            const response &#x3D; await fetch(url, reqOptions);
            const mime &#x3D; response.headers.get(&#x27;Content-Type&#x27;);
            const size &#x3D; response.headers.get(&#x27;Content-Length&#x27;);

            const contentDisposition &#x3D; response.headers.get(&#x27;Content-Disposition&#x27;);
            const name &#x3D; contentDisposition ? contentDisposition.match(/((?&amp;lt;&#x3D;filename&#x3D;&quot;)(.*)(?&#x3D;&quot;))/) : null;

            let data &#x3D; &#x27;&#x27;;
            if (response.buffer) {
                data &#x3D; (await response.buffer()).toString(&#x27;base64&#x27;);
            } else {
                const bArray &#x3D; new Uint8Array(await response.arrayBuffer());
                bArray.forEach((b) &#x3D;&gt; {
                    data +&#x3D; String.fromCharCode(b);
                });
                data &#x3D; btoa(data);
            }
            
            return { data, mime, name, size };
        }

        const res &#x3D; options.client
            ? (await options.client.pupPage.evaluate(fetchData, url, options.reqOptions))
            : (await fetchData(url, options.reqOptions));

        const filename &#x3D; options.filename ||
            (res.name ? res.name[0] : (pUrl.pathname.split(&#x27;/&#x27;).pop() || &#x27;file&#x27;));
        
        if (!mimetype)
            mimetype &#x3D; res.mime;

        return new MessageMedia(mimetype, res.data, filename, res.size || null);
    }
}

module.exports &#x3D; MessageMedia;
</code></pre>
          </article>
        </div>
      </div>
      <nav id="jsdoc-toc-nav" role="navigation"></nav>
    </div>
  </div>
  <footer id="jsdoc-footer" class="jsdoc-footer">
    <div id="jsdoc-footer-container">
      <p>
        Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc</a> 3.6.11 on November 22, 2024.
      </p>
    </div>
  </footer>
  <script src="scripts/jquery.min.js"></script>
  <script src="scripts/tree.jquery.js"></script>
  <script src="scripts/prettify.js"></script>
  <script src="scripts/jsdoc-toc.js"></script>
  <script src="scripts/linenumber.js"></script>
  <script src="scripts/scrollanchor.js"></script>
</body>

</html>